package main.普通数组;

import java.util.Arrays;

/**
 * @author tmh
 * @date 2024/7/17 19:59
 * @description
 */
public class T53最大子数组和 {
    //【暴力解法，超出时间限制】
    public int maxSubArray(int[] nums) {
        int maxSum = Integer.MIN_VALUE;
        for (int i = 0; i < nums.length; i++) {
            int sum = 0;
            for (int j = i; j < nums.length; j++) {
                sum = sum + nums[j];
                maxSum = maxSum >= sum ? maxSum : sum;
            }
        }
        return maxSum;
    }

    /**
     * 动态规划来解决
     *
     * @param nums
     * @return
     */
    public int maxSubArray1(int[] nums) {
        int len = nums.length;
        //dp[i]表示以num[i]结尾的连续子数组的最大和
        int[] dp = new int[len];
        dp[0] = nums[0];
        for (int i = 1; i < len; i++) {
            if (dp[i - 1] > 0) {
                dp[i] = dp[i - 1] + nums[i];
            } else {
                //如果前面以nums[i-1]为结尾的最大连续子数组的和都小于等于0了，那么就直接用最后一个
                //nums[i]来作为dp[i]；
                dp[i] = nums[i];
            }
        }
        //取出dp里面的最大值
        Arrays.sort(dp);
        return dp[len - 1];
    }
}
